//
//  LBHTTPSessionManager.h
//  LBNetworking
//
//  Created by WuShiHai on 19/5/30.
//  Copyright (c) 2019 Lebbay. All rights reserved.
//

#import <AFNetworking/AFNetworking.h>
#import "LBHTTPResponse.h"
#import "LBHTTPConfiguration.h"

typedef NS_ENUM(NSUInteger, LBHTTPSessionMethod) {
    LBHTTPSessionMethodUnkown = 0,
    LBHTTPSessionMethodPOST = 1,
    LBHTTPSessionMethodGET = 2,
    LBHTTPSessionMethodDELETE = 3,
    LBHTTPSessionMethodPUT = 4,
};

NS_ASSUME_NONNULL_BEGIN

typedef void (^LBHTTPResponseBlock)(NSError * _Nullable error, LBHTTPResponse *response);

/**
 通过LBHTTPSessionManager.h中给定的方法会使用该Protocol
 */
@protocol LBHTTPSessionManagerProtocol <NSObject>

/**
 请求前，会调用该方法，对参数进行封装，加入公共参数，进行加签，加密之类的操作。

 @param body 业务页面的入参
 @return 实际发给服务端的参数
 */
+ (NSDictionary *)packageParameters:(NSDictionary *)body;

/**
 接口请求之前，调用该方法，用于全局数据统计等业务

 @param task 发送请求的task
 */
+ (void)request:(NSURLSessionTask *)task;

/**
 接口请求之后，调用该方法，用于全局数据统计等业务，然后调用block返回

 @param resonse 包含返回接口的所有信息
 */
+ (void)response:(LBHTTPResponse *)resonse;

@optional
/**
 根据code判断是否成功，与配置中判断是否成功的调用顺序如下：
 BOOL isSuccess = NO;
 if ([(Class)self.protocol respondsToSelector:@selector(isSuccess:)]) {
    isSuccess = [self.protocol isSuccess:code];
 }else {
    isSuccess = [self.configuration.response isSuccess:code];
 }

 @param code 错误码
 @return 是否成功
 */
+ (BOOL)isSuccess:(NSString *)code;

@end

@interface LBHTTPSessionManager : AFHTTPSessionManager

/**
 生成一个实例

 @param baseURLString baseURL
 @param configuration 配置对象，具体可参考该类说明
 @param protocol 遵循LBHTTPSessionManagerProtocol协议的类名
 @return 返回一个是咧
 */
+ (instancetype)manager:(NSString *)baseURLString
          configuration:(LBHTTPConfiguration * _Nullable)configuration
               protocol:(Class<LBHTTPSessionManagerProtocol>)protocol;

/**
 实际调用[super manaer]

 @return 返回一个实例
 */
+ (instancetype)manager;

/**
 POST方式进行调用，实际调用的为request:URLString:parameters:configuration:completeHandler:

 @param URLString 请求路径，可以包含域名
 @param parameters 请求参数
 @param completeHandler 完成回调
 @return 任务
 */
- (NSURLSessionDataTask *)POST:(NSString *)URLString
                    parameters:(NSDictionary * _Nullable)parameters
               completeHandler:(LBHTTPResponseBlock)completeHandler;

/**
 LBHTTPSessionManager中暴露的核心调用方法

 @param method HTTP Method
 @param URLString 路径，可包含域名
 @param parameters 参数
 @param configuration 配置文件，如果与实例中的配置不一致，则会重新生成一个LBHTTPSessionManager对象，进行调用，完成后，释放对象
 @param completeHandler 回调
 @return 任务
 */
- (NSURLSessionDataTask *)request:(LBHTTPSessionMethod)method
                        URLString:(NSString *)URLString
                       parameters:(NSDictionary * _Nullable)parameters
                    configuration:(LBHTTPConfiguration * _Nullable)configuration
                  completeHandler:(LBHTTPResponseBlock)completeHandler;

@end

NS_ASSUME_NONNULL_END
